package com.hzchendou.blog.code.chapter02.example02;

/**
 * Singleton单例模式，使用静态代码块机制在JVM初始化class文件时自动生成单例对象 保障线程安全，同时实现了按需加载，解决了提前初始化问题
 *
 * @Date: 2022-07-11 14:59
 * @since: 1.0
 */
public class Example02_4 {

    static {
        System.out.println("初始化 Example02_4 static 代码块");
    }

    private Example02_4() {
        System.out.println("创建Example02_4实例");
    }

    ///获取实例
    public static Example02_4 getInstance() {
        return SingletonHolder.getInstance();
    }

    static class SingletonHolder {

        private static final Example02_4 instance = new Example02_4();

        static {
            System.out.println("初始化 SingletonHolder static 代码块");
        }

        public static Example02_4 getInstance() {
            return instance;
        }
    }


    public static void main(String[] args) {
        //// 可以注解 Example02_4.getInstance(); 查看打印信息
        ///如果不调用 getInstance方法，那么不会加载 SingletonHolder 类，也就不会初始化创建 Example02_4实例
        System.out.println("初始化");
        /// 调用了getInstance 方法，会去加载 SingletonHolder， 然后初始化 Example02_4 实例
        Example02_4.getInstance();
    }
}
